耶耶,開始第二個十天了,今天要講的是套件,其實想直接往實做的方向學,但發現不會的東西太多了,所以還是多講一下基礎的東西ˊˇˋ
所有Go程式都是由套件組成的,到目前為止也用過了一些套件,fmt
、math
。當然也可以創建自己的package
。
package
分為兩種:
executable package
(執行包):是用來產生我們可以執行的檔案,一定會包含 package main
並且帶有名為 main
的函式,不能被其他檔案給匯入。reusable package
(工具包):常稱作 library / dependency
,目的是可以放入可重複使用的程式邏輯,它是不能被直接執行的,用作給執行包的擴充功能。package
的特性:
package
package
名稱會與目錄名稱一樣main package
是程式的進入點// 個別匯入
import "fmt"
import . "sample-app/count"
import name "sample-app/count"
import _ "sample-app/count"
//多航匯入
import (
"fmt"
. "sample-app/count"
a "sample-app/count"
_ "sample-app/count"
)
fmt
,與Go一併安裝的套件,會從$GOROOT/src
尋找並匯入.
:會將整個package
的方法都放入這隻檔案中,可直接使用count
內的function()
a
:將引入的套件轉換成自己取的別名,使用法為a.function()
_
:不會使用到這個package
,但會init
這個套件Go語言比較特殊,不會在宣告時宣告public
、private
,而是直接以大小寫來區分,在套件內的變數或方法若以大寫開頭,則視為public
,可以從外部取用;若是小寫則為private
,不能從外部取用,只能在package
內使用。
寫一個可以計算平均值與中位數的套件,先建立個statistic
資料夾,並建立statistic.go
檔案,內有兩方法Sum()
與 Median()
package statistic
func Sum(arr []int) int {
sum := 0
for _, v := range arr {
sum += v
}
return sum
}
func Median(arr []int) float64 {
if len(arr)%2 == 0 {
return float64(arr[len(arr)/2-1]+arr[len(arr)/2]) / 2
} else {
return float64(arr[len(arr)/2])
}
}
接著在main.go
裡面匯入並使用
package main
import (
"fmt"
statis "sample-app/statistic" // 匯入套件並命名為statis
)
func main() {
arr := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
fmt.Printf("%8s %d\n", "Mean: ", statis.Sum(arr))
fmt.Printf("%8s %.1f\n", "Median: ", statis.Median(arr))
}
output:
Mean: 55
Median: 5.5
可以直接使用statis.
去呼叫並使用套件內的方法,在套件內的方法命名都以大寫為開頭,這樣才能從外部取得,下面寫一個錯誤的來舉例
在statistic.go
加入以下程式碼
func test() {
fmt.Println("Hello world!")
}
回主程式執行看看
func main() {
statis.test()
}
啊,報錯了,畢竟是屬於private
的東西
初始化程式,在套件被匯入時就會先執行,若在main
裡面寫init
,也會優先於main()
先跑一遍,簡單介紹一下就好ˊˇˋ
寫兩個package
分別為package1
與package2
package package1
import "fmt"
func init(){
fmt.Println("Init package1.")
}
package package2
import "fmt"
func init(){
fmt.Println("Init package2.")
}
在main.go
裡面測試
package main
import (
"fmt"
_ "sample-app/package1"
_ "sample-app/package2"
)
func init() {
fmt.Println("main init")
}
func main() {
fmt.Println("Hello")
}
output:
Init package1.
Init package2.
main init
Hello
這樣就能看出每個init
的執行順序。因為init
不會經過確認,而會在建立時就直接執行,因此要小心操作init
。
耶,今天的介紹到此結束,稍微有點架構的概念出來了,再來就是沒有規劃的學習了,也不確定明天的內容是什麼,讚讚
Packages
https://go.dev/tour/basics/1
Package 使用多個套件之前必須要懂的包
https://ithelp.ithome.com.tw/articles/10216224
day17 - 套件
https://ithelp.ithome.com.tw/articles/10219372
Golang package
https://ithelp.ithome.com.tw/articles/10206206
[Golang] Modules and Packages
https://pjchender.dev/golang/modules-and-packages/